//package org.moda.dsl;
//
//import org.apache.poi.ss.usermodel.Cell;
//import org.apache.poi.ss.usermodel.Row;
//import org.apache.poi.ss.usermodel.Sheet;
//import org.apache.poi.ss.usermodel.Workbook;
//import org.apache.poi.xssf.usermodel.XSSFWorkbook;
//
//import java.io.FileInputStream;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.math.BigDecimal;
//import java.util.*;
//import java.util.function.Predicate;
//import java.util.stream.Collectors;
//
//public class TableDSL {
//    private final List<Map<String, Object>> data;
//    private final List<String> titles;
//
//    private TableDSL(List<Map<String, Object>> data, List<String> headers) {
//        this.data = data;
//        this.titles = headers;
//    }
//
//    public static TableDSL from(String uri) throws IOException {
//
//    }
//
//    private static Object getCellValue(Cell cell) {
//        if (cell == null) {
//            return null;
//        }
//        switch (cell.getCellType()) {
//            case STRING:
//                return cell.getStringCellValue();
//            case NUMERIC:
//                return cell.getNumericCellValue();
//            case BOOLEAN:
//                return cell.getBooleanCellValue();
//            default:
//                return null;
//        }
//    }
//
//    public TableDSL filter(Predicate<Map<String, Object>> predicate) {
//        List<Map<String, Object>> filteredData = data.stream()
//                .filter(predicate)
//                .collect(Collectors.toList());
//        return new TableDSL(filteredData, titles);
//    }
//
//    public TableDSL project(String... columns) {
//        List<String> projectedHeaders = Arrays.asList(columns);
//        List<Map<String, Object>> projectedData = data.stream()
//                .map(row -> {
//                    Map<String, Object> projectedRow = new HashMap<>();
//                    for (String column : columns) {
//                        projectedRow.put(column, row.get(column));
//                    }
//                    return projectedRow;
//                })
//                .collect(Collectors.toList());
//        return new TableDSL(projectedData, projectedHeaders);
//    }
//
//    public TableDSL sort(String column, boolean ascending) {
//        List<Map<String, Object>> sortedData = new ArrayList<>(data);
//        sortedData.sort((a, b) -> {
//            Comparable valueA = (Comparable) a.get(column);
//            Comparable valueB = (Comparable) b.get(column);
//            return ascending ? valueA.compareTo(valueB) : valueB.compareTo(valueA);
//        });
//        return new TableDSL(sortedData, titles);
//    }
//
//    public Map<Object, TableDSL> groupBy(String column) {
//        Map<Object, List<Map<String, Object>>> grouped = data.stream()
//                .collect(Collectors.groupingBy(row -> row.get(column)));
//
//        return grouped.entrySet().stream()
//                .collect(Collectors.toMap(
//                        Map.Entry::getKey,
//                        e -> new TableDSL(e.getValue(), titles)
//                ));
//    }
//
//    public void saveToExcel(String filePath) throws IOException {
//        try (Workbook workbook = new XSSFWorkbook()) {
//            Sheet sheet = workbook.createSheet();
//
//            // Create header row
//            Row headerRow = sheet.createRow(0);
//            for (int i = 0; i < titles.size(); i++) {
//                Cell cell = headerRow.createCell(i);
//                cell.setCellValue(titles.get(i));
//            }
//
//            // Create data rows
//            for (int i = 0; i < data.size(); i++) {
//                Row row = sheet.createRow(i + 1);
//                Map<String, Object> rowData = data.get(i);
//                for (int j = 0; j < titles.size(); j++) {
//                    Cell cell = row.createCell(j);
//                    Object value = rowData.get(titles.get(j));
//                    if (value instanceof String) {
//                        cell.setCellValue((String) value);
//                    } else if (value instanceof Number) {
//                        cell.setCellValue(((Number) value).doubleValue());
//                    } else if (value instanceof Boolean) {
//                        cell.setCellValue((Boolean) value);
//                    }
//                }
//            }
//
//            try (FileOutputStream fos = new FileOutputStream(filePath)) {
//                workbook.write(fos);
//            }
//        }
//    }
//
//    public void print() {
//        System.out.println(String.join("\t", titles));
//        for (Map<String, Object> row : data) {
//            System.out.println(titles.stream()
//                    .map(header -> String.valueOf(row.get(header)))
//                    .collect(Collectors.joining("\t")));
//        }
//    }
//
//    public static void main(String[] args) {
//        BigDecimal[] cc = new BigDecimal(97).pow(17).divideAndRemainder(new BigDecimal(3233));
//        int c = cc[1].intValue();
//
//        BigDecimal[] aa = new BigDecimal(c).pow(2753).divideAndRemainder(new BigDecimal(3233));
//
////        BigDecimal[] aa = new BigDecimal(c).pow(2753).divideAndRemainder(new BigDecimal(3233));
//        int a = aa[1].intValue();
//
//        System.out.println(c +"," + a);
//    }
//}
